JGVue.prototype.mount = function () {
  this.render = this.createRenderFn()
  this.mountComponent()
}

JGVue.prototype.mountComponent = function () {
  let mount = () => {
    this.update(this.render())
  }
  mount.call(this);
  /*
  这个watcher就是全局的watcher，在任何一个位置都可以访问他（简化的写法)
  mount是vue的渲染函数，渲染函数会访问data，
  而watcher的类中，get方法就触发getter，切getter的第二个参数就是expOrfn，
  而在watcher的构造器中，getter就是expOrfn，
  watcher的类中传入两个参数，第一个是vm的实例，第二个是expOrfn在这里
  expOrfn就是mount渲染函数

  mount在调用的时候就是watcher类中的get方法被调用的时候
  */
  // Dep.target = new Watcher(this, mount) // 这里相当于调用了mount
  new Watcher(this, mount) // 这里相当于调用了mount
}

JGVue.prototype.createRenderFn = function () {
  let ast = getVNode(this._template);
  return function render() {
    let _tmp = combine(ast, this._data);
    return _tmp
  }
}
JGVue.prototype.update = function (vnode) {
  let realDom = parseVNode(vnode)
  this._parent.replaceChild(realDom, document.querySelector('#root'))
}

